// Kony


#include "Actor/BaseBlastBall.h"

#include "AbilitySystemBlueprintLibrary.h"
#include "AbilitySystemComponent.h"
#include "BaseGameplayTags.h"
#include "GameplayCueManager.h"
#include "AbilitySystem/BaseAbilitySystemLibrary.h"
#include "Components/AudioComponent.h"

void ABaseBlastBall::BeginPlay()
{
	Super::BeginPlay();
	//调用开始时间线，这个在蓝图中实现
	StartOutgoingTimeline();
}

//重写处理碰撞函数，父类是碰撞就爆炸，这个类是穿透敌人 回来时爆炸
void ABaseBlastBall::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	//判断验证是否允许触发重叠碰撞
	if (!IsValidOverlap(OtherActor)) return;

	if (HasAuthority())
	{
		//计算伤害能力系统 对角色能力系统操作
		if (UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(OtherActor))
		{
			//获取死亡冲力向量
			const FVector DeathImpulse = GetActorForwardVector() * DamageEffectParams.DeathImpulseMagnitude;
			DamageEffectParams.DeathImpulse = DeathImpulse;
			//这部分是攻击碰到目标的时候，设置施加效果的目标
			DamageEffectParams.TargetAbilitySystemComponent = TargetASC;
			//应用伤害效果参数
			UBaseAbilitySystemLibrary::ApplyDamageEffect(DamageEffectParams);
		}
		//如果是服务器权限，销毁自身
		// Destroy();
	}
	
}
//重写碰撞命中函数
void ABaseBlastBall::OnHit()
{
	//这部分重写 是为了演示 非RPC模式的 客户端本地执行玩法提示，
	//因为这个爆炸球会有多个 如果使用RPC模式，会导致服务器压力过大，而服务器只需要计算伤害不需要告诉客户端播放 ，客户端在接收到命中事件后 只需要自行指定播放动画即可

	//获取当前火球的所有者
	if (GetOwner())
	{
		//创建游戏通知参数
		FGameplayCueParameters CueParams;
		//设置提示位置
		CueParams.Location = GetActorLocation();
		//本地执行游戏玩法提示
		UGameplayCueManager::ExecuteGameplayCue_NonReplicated(GetOwner(),FBaseGameplayTags::Get().GameplayCue_FireBlast,CueParams);
	}
	if (LoopingSoundComponent)
	{
		LoopingSoundComponent->Stop(); //停止持续声音
		LoopingSoundComponent->DestroyComponent();//销毁组件
	}
	//设置命中
	bHit = true;
}
